package com.his.emr.print;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import org.openqa.selenium.By;
import org.openqa.selenium.Dimension;
import org.openqa.selenium.Point;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;

import com.his.emr.print.entity.EleIdAndBounds;
import com.his.emr.print.entity.MyPage;
import com.his.emr.print.entity.MyPages;
import com.his.emr.print.entity.WebEleBounds;
import com.his.emr.print.utils.My;
import com.his.emr.print.utils.MyDriver;

/**
 * date: 2018年2月15日<br>
 * 
 * 
 * @author Wxg
 *
 */
public class WhosOverPageV2 {
	
	/**
	 * div[class="emr_main"] 的高度
	 */
	public static final int MAIN_HEIGHT = Integer.valueOf(My.conf("MAIN_HEIGHT")); // 940,800;
	
	
	/**
	 * 暂时未使用
	 * 如果元素的高度小于 MIN_H, 直接输出到下一个页面!( 不拆分这个元素 )
	 */
	public static final int MIN_H = 20;
	
	/**
	 * 每页应该输出的block元素的id集合
	 */
	private MyPages pages;
	
	/**
	 * 跨页元素集合
	 */
	private List<EleIdAndBounds> overPageEleList;
	
	/**
	 * 源html文件地址
	 */
	private String sourceFilepath;
	
	/**
	 * id 前缀
	 */
	private String idPrefix;
	
	public WhosOverPageV2(String sourceFilepath, String idPrefix){
		this.sourceFilepath = sourceFilepath;
		this.idPrefix = idPrefix;
		
	}
	
	public List<EleIdAndBounds> parse(){
		overPageEleList = new ArrayList<EleIdAndBounds>();
		
		List<EleIdAndBounds> ibList = getBlockElesById();
		
		int len = ibList.size();
		int height = 0;
		int previousHeight = 0;
		
		pages = new MyPages();
		MyPage page = pages.newPage();
		for(int i=0; i<len; i++){
			EleIdAndBounds ib = ibList.get(i);
			previousHeight = height;
			height += ib.bounds.height;
			if( height > MAIN_HEIGHT ){
				// if( ib.bounds.height <= MIN_H ){  } // 不添加到list中!
				
				/**
				 * 只在`whosOverPage`方法中的"EleIdAndBounds"元素有设置这个值
				 * 用来将块元素分割成行元素时做辅助(参考)
				 */
				ib.setStartHeightInPage(previousHeight); 
				
				overPageEleList.add( ib ); // 当前元素
				height = ib.bounds.height; // 重新开始计算
				page = pages.newPage();
			}
			page.add(ib.id);
		}
		
System.out.println("===System.out.println===");
System.out.println( Arrays.toString(overPageEleList.toArray()) );
if(overPageEleList.size() > 0){
	for(EleIdAndBounds eib : overPageEleList){
		System.out.println( eib.getOuterHtml() );
	}
}


		return overPageEleList;
	}
	
	public MyPages getPages() {
		return pages;
	}

	public List<EleIdAndBounds> getOverPageEleList() {
		return overPageEleList;
	}

	private List<EleIdAndBounds> getBlockElesById(){
		List<EleIdAndBounds> retList = new ArrayList<EleIdAndBounds>();

		String url = My.fileUrl( sourceFilepath );

		/**
		 * update 2018年2月15日
		 * WebDriver driver = MyDriver.getStaticDriver();
		 * WebDriver driver = MyDriver.getPhantomJSDriver(); 调用这个方法,非常慢!
		 */
		
		WebDriver driver = MyDriver.getStaticDriver();
		driver.get( url );
		
		String strXpath = null; // "//*[starts-with(@id,'id_')]";
		strXpath = "//*[starts-with(@id,'" + idPrefix + "')]";
		List<WebElement> list = driver.findElements(By.xpath( strXpath ));

		// String[] exceptArr = {"tbody", "tr", "td"}; // 一级子元素不会包含这些
		
		if (null != list) {
			for (WebElement ele : list) {
				Dimension d = ele.getSize();
				Point p = ele.getLocation();
				WebEleBounds bounds = new WebEleBounds(p.x, p.y, d.width, d.height);
				EleIdAndBounds eib = new EleIdAndBounds(ele.getAttribute("id"), bounds);
				// Add 2018年2月15日: 设置"outerHTML"
				eib.setOuterHtml(ele.getAttribute("outerHTML"));
				eib.setTagName(ele.getTagName());
				
				retList.add( eib );
			}
		}

		/**
		 * Add 2018年2月15日
		 * MyDriver.closeCurrentWindow(); 此方法不行,我的程序中并没有开启多个窗口,get()方法应该只在当前窗口reload.
		 */
		
		/**
		 * 这里并没有调用`driver.quit`, 是延迟到之后的某一个时刻再调用. 使得driver能够得到重用!
		 */
		return retList;
	}

	public String getSourceFilepath() {
		return sourceFilepath;
	}
	
	
	
	
}
